package com.blog4j.article.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.blog4j.api.vo.ArticleDateCountVo;
import com.blog4j.api.vo.CategoryArticleCountVo;
import com.blog4j.api.vo.MonthActiveUserVo;
import com.blog4j.api.vo.MonthArticleViewsVo;
import com.blog4j.article.context.CreateArticleContext;
import com.blog4j.article.context.UpdateArticleContext;
import com.blog4j.article.entity.ArticleEntity;
import com.blog4j.article.vo.req.ArticleByCategoryIdReqVo;
import com.blog4j.article.vo.req.ArticleListReqVo;
import com.blog4j.article.vo.req.FavoriteArticleByUserIdReqVo;
import com.blog4j.article.vo.req.FavoriteReqVo;
import com.blog4j.article.vo.req.LikeArticleReqVo;
import com.blog4j.article.vo.req.OrganizationArticleListReqVo;
import com.blog4j.article.vo.req.PortalArticleListReqVo;
import com.blog4j.article.vo.req.UserArticleReqVo;
import com.blog4j.article.vo.resp.ArticleCategoryNumsRespVo;
import com.blog4j.article.vo.resp.ArticleDetailRespVo;
import com.blog4j.article.vo.resp.ArticleRespVo;
import com.blog4j.article.vo.resp.ArticleStatusRespVo;
import com.blog4j.api.vo.DeleteUserArticleVo;
import com.github.pagehelper.PageInfo;

import java.util.List;
import java.util.Map;

/**
 * @author 98k灬
 * @version v1.0.0
 * @Description : 功能描述
 * @Create on : 2024/6/28 13:02
 **/
public interface ArticleService extends IService<ArticleEntity>  {
    /**
     * 获取文章列表
     *
     * @param articleListReqVo 查询条件
     * @return 文章列表
     */
    PageInfo<ArticleDetailRespVo> getArticleList(ArticleListReqVo articleListReqVo);

    /**
     * 获取所有的文章状态
     *
     * @return 所有的文章状态
     */
    List<ArticleStatusRespVo> statusList();

    /**
     * 根据文章ID删除文章
     *
     * @param articleId 文章ID
     */
    void deleteArticle(String articleId);

    /**
     * 根据文章ID发布文章
     *
     * @param articleId 文章ID
     */
    void publishArticle(String articleId);

    /**
     * 查询文章详情信息
     *
     * @param articleId 文章ID
     * @return 文章详情信息
     */
    ArticleRespVo info(String articleId);

    /**
     * 编辑文章信息
     *
     * @param context 更新文章信息的上下文信息
     */
    void updateArticle(UpdateArticleContext context);

    /**
     * 创建文章信息
     *
     * @param context 创建文章信息的上下文信息
     */
    void create(CreateArticleContext context);

    /**
     * 删除用户名下的文章信息
     *
     * @param vo 用户集合
     */
    void deleteUserArticle(DeleteUserArticleVo vo);

    /**
     * 获取本周排行榜的文章
     *
     * @return 文章列表
     */
    List<ArticleEntity> getViewsArticle();

    /**
     * 点赞或取消点赞文章
     *
     * @param reqVo 请求信息
     */
    void likeArticle(LikeArticleReqVo reqVo);

    /**
     * 收藏文章
     *
     * @param reqVo 请求信息
     */
    void favorite(FavoriteReqVo reqVo);

    /**
     * 文章浏览量
     *
     * @param articleId 文章ID
     */
    void articleViews(String articleId);

    /**
     * 获取当前文章的上一篇和下一篇
     *
     * @param articleId 文章ID
     * @return 文章信息
     */
    Map<String, ArticleRespVo> getNextAndPreviousArticle(String articleId);

    /**
     * 获取推荐文章列表
     *
     * @param articleId 文章ID
     * @return 推荐文章列表
     */
    List<ArticleRespVo> getRecommendArticle(String articleId);

    /**
     * 获取最新文章列表
     *
     * @return 最新文章列表
     */
    List<ArticleRespVo> getNewArticleList();

    /**
     * 根据分类ID获取文章信息
     *
     * @param reqVo 请求信息
     * @return 文章信息
     */
    PageInfo<ArticleRespVo> getByCategoryId(ArticleByCategoryIdReqVo reqVo);

    /**
     * 获取用户的文章数、分类数
     *
     * @return 用户的文章数、分类数
     */
    ArticleCategoryNumsRespVo getArticleCategoryNums(String userId);

    /**
     * 获取用户的文章
     *
     * @param reqVo 请求信息
     * @return 用户文章
     */
    PageInfo<ArticleRespVo> getUserArticle(UserArticleReqVo reqVo);

    /**
     * 查询用户的收藏文章
     *
     * @param reqVo 请求信息
     * @return 收藏文章
     */
    PageInfo<ArticleRespVo> getFavoriteArticleByUserId(FavoriteArticleByUserIdReqVo reqVo);

    /**
     * 用户是否收藏该文章
     *
     * @param articleId 文章ID
     * @return 结果
     */
    boolean isFavorite(String articleId);

    /**
     * 文章个数
     *
     * @return 文章个数
     */
    Integer articleCount();

    /**
     * 获取每天的文章数
     *
     * @return 每天的文章数
     */
    List<ArticleDateCountVo> getArticleDateCount();

    /**
     * 获取本月活跃用户列表
     *
     * @return 本月活跃用户列表
     */
    List<MonthActiveUserVo> getMonthActiveUserList();

    /**
     * 获取本月文章阅读量列表
     *
     * @return 本月文章阅读量列表
     */
    List<MonthArticleViewsVo> getMonthArticleViewsList();

    /**
     * 获取分类对应的文章数
     *
     * @return 分类对应的文章数
     */
    List<CategoryArticleCountVo> getCategoryArticleCount();

    /**
     * 根据组织ID获取组织文章列表
     *
     * @param reqVo 请求
     * @return 组织信息
     */
    PageInfo<ArticleRespVo> organizationArticleList(OrganizationArticleListReqVo reqVo);

    /**
     * 获取文章列表(门户端)
     *
     * @param reqVo 查询条件
     * @return 文章列表
     */
    PageInfo<ArticleRespVo> getPortalArticleList(PortalArticleListReqVo reqVo);

    /**
     * 根据文章ID获取文章信息
     *
     * @param articleId 文章ID
     * @return 文章信息
     */
    ArticleDetailRespVo articleInfo(String articleId);
}
